 /* LEXER per un server HTML */
%{
	char *str_trim(char *stringa) { 
		char *attuale, *in_no_b; 
		for (attuale = in_no_b = stringa; *attuale != NULL; ++attuale) 
			if (*attuale != ' ' && *attuale != '\n' ) *(in_no_b++) = *attuale; *in_no_b = NULL; return(stringa); }
	char *str_togliacapo(char *stringa) { 
		char *attuale, *in_no_b; 
		for (attuale = in_no_b = stringa; *attuale != NULL; ++attuale) 
			if (*attuale != '\n' ) *(in_no_b++) = *attuale; *in_no_b = NULL; return(stringa); }
	typedef union{
		char *stringa;
		int val;
		int boolean;
	} valore_parsed;
	#include "y.tab.h"
		#include <malloc.h>
	
    	#include <stdlib.h>
	#include <string.h>
    	void yyerror(char *);
%}

%%


GET	{
						yylval.com = (char *) strdup(yytext);
						return COMANDO;
					}					
HEAD	{
						yylval.com = (char *) strdup(yytext);
						return COMANDO;
					}				
					
POST	{
						yylval.com = (char *) strdup(yytext);
						return COMANDO;
					}					

PUT	{
						yylval.com = (char *) strdup(yytext);
						return COMANDO;
					}					

DELETE	{
						yylval.com = (char *) strdup(yytext);
						return COMANDO;
					}					

Connection:[^\n]*[\n]*	{
						yytext+=sizeof(char)*11;
						if(yytext!=NULL && yytext[0]==' '){
							yytext+=sizeof(char);
						}
						yylval.headerstring = (char *) strdup(str_togliacapo(yytext)); 
						return CONNECTION;
						
					}
User-Agent:[^\n]*[\n]*	{

						yytext+=sizeof(char)*11;
						if(yytext!=NULL && yytext[0]==' '){
							yytext+=sizeof(char);
						}
						yylval.headerstring = (char *) strdup(str_togliacapo(yytext));
						return USERAGENT;
					}
Host:[^\n]*[\n]*	{
						yytext+=sizeof(char)*5;
						if(yytext!=NULL && yytext[0]==' '){
							yytext+=sizeof(char);
						}
						yylval.headerstring = (char *) strdup(str_togliacapo(yytext));
					
						return HOST;
					}
Accept:[^\n]*[\n]*	{
						yytext+=sizeof(char)*7;
						yylval.headerstring = (char *) strdup(str_trim(yytext)); 
						return ACCEPT;
					}
Accept-Encoding:[^\n]*[\n]*	{
						yytext+=sizeof(char)*16;
						yylval.headerstring = (char *) strdup(str_trim(yytext));
						return ACCEPTENCODING;
					}															
HTTP\/[01]\.[019][\n]*	{
							yylval.versione = (char *) strdup(yytext);
							return VERSIONE;				
					}

[a-zA-Z\/\_.\?=&+]+		{
							yylval.indirizzo = (char *) strdup(yytext);
							return INDIRIZZO;
					}

%%

int yywrap(void) {
    return 1;
}
